﻿using IQReportes.Boundary;
using IQReportes.Models.Logica;
using IQReportes.Utils;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;

namespace IQReportes.Models
{
    /// <summary>
    /// Clase de parámetros para la consulta de los módulos de transacciones
    /// </summary>
    public class QueryTXModel
    {
        /// <summary>
        /// Fecha inicial
        /// </summary>
        public string fechaInicial;
        /// <summary>
        /// Fecha inicial tipo fecha
        /// </summary>
        public DateTime desde;
        /// <summary>
        /// fecha final
        /// </summary>
        public string fechaFinal;
        /// <summary>
        /// fecha final tipo fecha
        /// </summary>
        public DateTime hasta;
        /// <summary>
        /// cantidad de días
        /// </summary>
        public int cantidadDeDias;
        /// <summary>
        /// fecha seleccionada
        /// </summary>
        public int seleccionFecha;
        /// <summary>
        /// módulo que realiza la llamada
        /// </summary>
        public int modulo;
        /// <summary>
        /// valor del tree seleccionado
        /// </summary>
        public int? tipoValorTree = -1;
        /// <summary>
        /// tipo de chart seleccionado
        /// </summary>
        public int tipoChart;
        /// <summary>
        /// institución seleccionada
        /// </summary>
        public int institucion;
        public int? puntoEquilibrio = -1;
        /// <summary>
        /// nivel del nodo hijo seleccionado del tree
        /// </summary>
        public string nivelTreeHijo;
        /// <summary>
        /// nivel del nodo padre seleccionado del tree
        /// </summary>
        public string nivelTreePadre;
        /// <summary>
        /// nivel actual del tree
        /// </summary>
        public int nivelTree;
        /// <summary>
        /// tipo de transacción nivel 1 selección ( módulo 2)
        /// </summary>
        public string tipoTxNivel1="";
        /// <summary>
        /// tipo de transacción nivel 2 selección ( módulo 2)
        /// </summary>
        public string tipoTxNivel2="";
        /// <summary>
        /// estado de transacción seleccionado módulo 3
        /// </summary>
        public string estadoTx = "";
        /// <summary>
        /// Código del nodo hijo del tree
        /// </summary>
        public string codHijo = "";
        /// <summary>
        /// Código del nodo padre del tree
        /// </summary>
        public string codPadre = "";
        /// <summary>
        /// Código de tabla tiempo
        /// </summary>
        public int codTablaTiempo ;
        /// <summary>
        /// antigüedad
        /// </summary>
        public int antiguedad;
        /// <summary>
        /// antigüedad hasta
        /// </summary>
        public int? antiguedadHasta;
        /// <summary>
        /// id de categoría de transacción seleccionada
        /// </summary>
        public int? idCategoriaTx;
        /// <summary>
        /// id de tipo de transacción seleccionada
        /// </summary>
        public int? idTipoTx;
        /// <summary>
        /// id de estado de transacción seleccionada
        /// </summary>
        public int? idEstadoTx;
        /// <summary>
        /// constructor con parámetros
        /// </summary>
        /// <param name="fechaInicial">fecha inicial</param>
        /// <param name="fechaFinal">fecha final</param>
        /// <param name="modulo">módulo</param>
        /// <param name="tipoValorTree">valor de tree</param>
        /// <param name="tipoChart">tipo de chart</param>
        /// <param name="institucion">institución</param>
        /// <param name="puntoEquilibrio"></param>
        /// <param name="nivelTreeHijo">nivel hijo de tree</param>
        /// <param name="nivelTreePadre">nivel padre de tree</param>
        /// <param name="codHijo">código de nodo hijo</param>
        /// <param name="codPadre">código de nodo padre</param>
        /// <param name="nivelTree">nivel tree</param>
        /// <param name="tipoTxNivel1">tipo de transacción nivel 1</param>
        /// <param name="tipoTxNivel2">tipo de transacción nivel 2</param>
        /// <param name="estadoTx">estado de transacción</param>
        /// <param name="seleccionFecha">fecha seleccionada</param>
        public QueryTXModel(string fechaInicial, string fechaFinal, int modulo, int? tipoValorTree, int tipoChart, int institucion, int? puntoEquilibrio,
            string nivelTreeHijo, string nivelTreePadre,string codHijo,string codPadre,int nivelTree,string tipoTxNivel1, string tipoTxNivel2, string estadoTx,int seleccionFecha)
        {
            // TODO: Complete member initialization
            TipoTransaccionDAO db = new TipoTransaccionDAO();
            this.fechaInicial = "";
            if (fechaInicial != null && !Constantes.CADENA_VACIA.Equals(fechaInicial))
            {
                fechaInicial = FormatterTransacciones.stringToStringFecha(fechaInicial);
                this.fechaInicial = fechaInicial;
                this.desde = DateTime.ParseExact(fechaInicial, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            }
            this.fechaFinal = "";
            if (fechaFinal != null && !Constantes.CADENA_VACIA.Equals(fechaFinal))
            {
                fechaFinal = FormatterTransacciones.stringToStringFecha(fechaFinal);
                this.fechaFinal = fechaFinal;
                this.hasta = DateTime.ParseExact(fechaFinal, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            }
            this.cantidadDeDias = 0;
            if (this.desde != null && this.hasta!=null ){
                TimeSpan diff = hasta - desde;
                this.cantidadDeDias = diff.Days+1;
            }
            this.modulo = modulo;
            this.tipoValorTree = tipoValorTree;
            this.tipoChart = tipoChart;
            this.institucion = institucion;
            this.puntoEquilibrio = puntoEquilibrio;
            this.nivelTree = nivelTree;
            this.nivelTreeHijo = null;
            if (nivelTreeHijo != null && !("NULL").Equals(nivelTreeHijo.ToUpper()) && nivelTreeHijo != "")
            {
                this.nivelTreeHijo = nivelTreeHijo;
            }
            this.nivelTreePadre = null;
            if (nivelTreePadre != null && !("NULL").Equals(nivelTreePadre.ToUpper()) && nivelTreePadre != "")
            {
                this.nivelTreePadre = nivelTreePadre;
            }
            this.tipoTxNivel1 = null;
            this.idCategoriaTx = null;
            if (tipoTxNivel1 != null && !("NULL").Equals(tipoTxNivel1.ToUpper()) && tipoTxNivel1!="")
            {
                this.tipoTxNivel1 = tipoTxNivel1;
                this.idCategoriaTx = db.categoriasTransaccion.Where(x => x.vcNombre.CompareTo(tipoTxNivel1) == 0).First().idCategoria;
            }
            this.tipoTxNivel2 = null;
            this.idTipoTx = null;
            if (tipoTxNivel2 != null && !("NULL").Equals(tipoTxNivel2.ToUpper()) && tipoTxNivel2!= "" )
            {
                this.tipoTxNivel2 = tipoTxNivel2;
                this.idTipoTx= db.tiposTransaccion.Where(x => x.vcNombre.CompareTo(tipoTxNivel2) == 0).First().idTipo;
            }
            this.estadoTx = null;
            this.idEstadoTx = null;
            if (estadoTx != null && !("NULL").Equals(estadoTx.ToUpper()) && estadoTx!="")
            {
                this.estadoTx = estadoTx;
                this.idEstadoTx = db.estadosTransaccion.Where(x => x.vcNombre.CompareTo(estadoTx) == 0).First().idEstado;
            }
            this.codHijo = null;
            if (codHijo != null && !("NULL").Equals(codHijo.ToUpper()) && codHijo!="")
            {
                this.codHijo = codHijo;
            }
            this.codPadre = null;
            if (codPadre != null && !("NULL").Equals(codPadre.ToUpper()) && codPadre!="")
            {
                this.codPadre = codPadre;
            }
            this.seleccionFecha = seleccionFecha;

            CalculoTiempoAntiguedad calculoTiempoAntiguedad = (new LogicaCalcularTiempoAntiguedad()).ejecutarTx(desde);
            this.antiguedad = calculoTiempoAntiguedad.antiguedad;
            
            this.codTablaTiempo = calculoTiempoAntiguedad.codTablaTiempo;

            if (hasta != null && !Constantes.CADENA_VACIA.Equals(hasta))
            {
                CalculoTiempoAntiguedad calculoTiempoAntiguedadHasta = (new LogicaCalcularTiempoAntiguedad()).ejecutarTx(hasta);
                this.obtenerHasta(calculoTiempoAntiguedad, calculoTiempoAntiguedadHasta);
            }
            else
            {
                this.antiguedadHasta = null;
            }
            /*TimeSpan diferenciaDias = DateTime.Now - DateTime.Now.AddDays(-1);
            if (this.desde != null && this.hasta != null)
            {
                diferenciaDias = hasta -desde;
            }
            //hasta es obtenido de LogicaParemtro getDiasInicialTx

            int dias = diferenciaDias.Days;
            if (dias >= 0)
            {
                if (dias <=6)
                {
                    this.antiguedad = dias;
                    this.codTablaTiempo = Constantes.CODIGO_DIA;
                }
                else if (dias<=42){
                    this.antiguedad = dias/7;
                    this.codTablaTiempo = Constantes.CODIGO_SEMANA;
                    this.antiguedad -= 1;
                }
                else if (dias <= 365)
                {
                    this.antiguedad = dias / 30 > 12 ? 12 : dias / 30;
                    this.codTablaTiempo = Constantes.CODIGO_MES;
                    this.antiguedad -= 1;
                }
                else
                {
                    this.antiguedad = -1;
                    
                    this.codTablaTiempo = Constantes.CODIGO_ANO;
                }
                //this.antiguedad -= 1;
                
            }*/
        }
        /// <summary>
        /// Obtener atributos desde y hasta de fecha
        /// </summary>
        /// <param name="desde">desde</param>
        /// <param name="hasta">hasta</param>
        private void obtenerHasta(CalculoTiempoAntiguedad desde, CalculoTiempoAntiguedad hasta)
        {
            int codTablaDesde = desde.codTablaTiempo;
            int codTaablaHasta = hasta.codTablaTiempo;
            int antHasta = hasta.antiguedad;

            if (codTablaDesde == Constantes.CODIGO_SEMANA)
            {
                if (codTaablaHasta == Constantes.CODIGO_DIA)
                {
                    antHasta = 0;
                }
            }

            if (codTablaDesde == Constantes.CODIGO_MES)
            {
                if (codTaablaHasta == Constantes.CODIGO_DIA)
                {
                    antHasta = 0;
                }
                else if (codTaablaHasta == Constantes.CODIGO_SEMANA && antiguedadHasta <= 4)
                {
                    antHasta = 0;
                }
                else if (codTaablaHasta == Constantes.CODIGO_SEMANA && antiguedadHasta > 4)
                {
                    antHasta = 1;
                }
            }
            codTaablaHasta = codTablaDesde;
            this.antiguedadHasta = antHasta;
        }
    }
}